#ifndef MYSERVER_H
#define MYSERVER_H
/*
 * 服务器驱动类，提供网络通信基础功能
 * 版本：V1.0
 * 更新日志：
 *      [V1.0]
 *          新增功能：
 *              1.创建模块
 *              2.启动服务器，监听断开
 *              3.关闭服务器
 *              4.通过网络向指定客户端发送、接收数据
 *              5.获取状态
*/
#include <QObject>
#include <QJsonObject>
class QTcpSocket;
class QTcpServer;

typedef struct client{
    QTcpSocket *socket;     //套接字
    QString data;           //数据缓冲
    quint32 index;          //客户端序号
    QString ip;
    quint16 port;
}Client;

class MyServer : public QObject
{
    Q_OBJECT
protected:
    //构造函数，初始化服务对象，内部处理
    explicit MyServer(QObject *parent = nullptr);

public:
    //析构函数
    ~MyServer();
    //[static] 获取单例对象
    //@return MyServer * 单例对象
    static MyServer * getObject();
    //启动服务器
    //@param port 监听的端口
    //@bool 启动结果
    bool startServer(quint16 port);
    //停止服务器
    void stopServer();
    //获取客户端列表
    //@return QJsonArray Json 数组 客户端列表，每个成员为一个Json对象，代表一个客户端信息，
    //                  包括index,ip,port三项
    //                  示例：{"index": 5, "ip": ":::ffff:127.0.0.1", "port": 5546}
    QJsonArray getClientList();
    //获取连接数量
    //@return int 客户端数量
    int getClientCount();
    //获取服务器状态
    //@return bool 服务器状态
    bool getServerState();
    //向指定客户端发送数据
    //@param index 客户端编号
    //@param data 要发送的数据
    void sendDataToClient(int index, const QByteArray &data);
    void sendDataToClient(int index, const QJsonObject &data);
    void sendDataToClient(int index, const QJsonDocument &data);
    //向所有客户端发送数据
    //@param data 要发送的数据
    void sendDataToAllClient(const QByteArray &data);
    void sendDataToAllClient(const QJsonObject &data);
    void sendDataToAllClient(const QJsonDocument &data);

signals:
    //接收到客户端的数据
    void receiveDataFromClient(int index, QJsonObject data);

protected slots:
    void serverNewConnectionSlot();
    void socketDisconnectedSlot();
    void socketReadyReadSlot();

protected:
    void handleData(quint32 index);

    QTcpServer *server;
    QList<Client *> clientList;
    quint32 nowIndex = 0;
};

#endif // MYSERVER_H
